﻿<?php

/*
 * 数据表备份
 */
class TablebackAction extends CommonAction{
    
    /*
     * 备份数据库界面
     */
    public function index(){
        $m = M();
        $list = $m->query('show tables');
        foreach($list as $k=>$v){
            $tableName = array_pop($v);
            $table[$k]['tableName'] = $tableName;
            $table[$k]['tableNum']=$m->table($tableName)->count();
        }
        $this->assign('table',$table);
        $this->display();
    }
    
    /*
     * 备份或者还原数据表
     */
    public function Back(){
        //----备份表----
        if($_GET['status']==1){
            if(!$_GET['tables']){$tables= I('post.tables');}else{$tables = explode(',',$_GET['tables']);}//提交备份的表
            if(!$_GET['count']){$count = count($tables);}else{$count = $_GET['count'];}//表总数  
            //目录安全检测
            if(C('BACKDIR') == 'back' || !C('BACKDIR')){
                exit('为安全着想，你必须修改默认备份目录back，请在 【系统参数设置】 里设置 【备份数据库目录】 选项的配置值，配置值必须为英文小写，修改完成后请点击【缓存更新】');
            }
            $backDir = LIB_PATH.'TableBack/'.C('BACKDIR');//备份目录
            if(!is_dir($backDir))//检测备份目录是否存在
            { 
                mkdir($backDir); //新建备份目录 
            }
            //备份所有表结构，在第一次提交时
            if($_POST['tables']){
                foreach($tables as $_table){
                    $sql .= "DROP TABLE IF'' EXISTS `{$_table}`;\r\n\r\n";
                    $create = M()->query("SHOW CREATE TABLE {$_table}");
                    $sql .= array_pop($create[0]).";\r\n\r\n";                    
                }
                //去除AUTO_INCREMENT
                $sql = preg_replace("#AUTO_INCREMENT=([0-9]{1,})[ \r\n\t]{1,}#i", "", $sql);
                file_put_contents($backDir.'/tables.txt', $sql);//保存备份的SQL语句
                F('tables',$tables,$backDir.'/');//保存备份的所有表名称
            }
            $table = array_shift($tables);//当前备份的表
            if(!$table){exit('<h1>全部表备份完成</h1>');}
            //备份当前这张表的数据
            $all = M()->table($table)->select();
            if($all){
                foreach($all as $_data){
                    $sql_insert .= 'INSERT INTO `'.$table.'` VALUES(';
                    $a .= "'";
                    foreach($_data as $zy){$_data2[] = addslashes($zy);}
                    $a .= implode("','", $_data2);
                    $sql_insert .= $a."'";
                    $sql_insert .=");#####dadaocms#####\r\n\r\n";
                    $a='';unset($_data2);
                }
                file_put_contents($backDir.'/'.$table.'.txt', $sql_insert);//保存备份的SQL语句
            }

            $count2 = count($tables);//还剩下多少个表
            $tables = implode(',',$tables);//剩下的表
            $msg = "共有表{$count}个，当前正在备份：{$table} 表，<br />还有{$count2}个表需要备份，请不要关闭浏览器！";
            $this->success($msg,U('Admin/TableBack/Back',array('status'=>$_GET['status'],'tables'=>$tables,'count'=>$count)),1);
        }
        
        //----还原表----
        if($_GET['status']==2){
            $backDir = LIB_PATH.'TableBack/'.C('BACKDIR');//备份目录
            //还原表结构
            $tables = file_get_contents($backDir.'/tables.txt');
            //还原所有表内容
            foreach($_POST['tables'] as $k=>$v){
                $tableFile =  $backDir.'/'.$v.'.txt';
                $tableTxt = file_get_contents($tableFile);
                dump($tableTxt);//单个表的内容，这里需要一个表跳转一次，这样可以可以避免超时
            }
            
        }
    }
    
    /*
     * 还原数据库界面
     */
    public function restore(){
        $backDir = LIB_PATH.'TableBack/'.C('BACKDIR');//备份目录
        $list = F('tables','',$backDir.'/');
        if(!$list){$this->error('请先备份数据库后再还原',U('Admin/Tableback/index'));}
        foreach($list as $k=>$v){
            $table[$k]['tableName'] = $v;
        }
        $this->assign('table',$table);
        $this->display();
    }
    
}
